/**
 * 函数的声明方式
 * 总结：一般只是使用方式一来声明函数。
 */
/**
 * ==================this指向=====================
 * 函数的this指向问题
 * 如果在函数中使用了this，我们需要显示的声明this的类型
 */

/**
 * 方式一
 * 普遍使用这种方式
 */
const sum = (a: number, b: number): number => {
  return a + b;
};
/**
 * 方式二
 * 可读性太差了
 */
const sum1: (a: number, b: number) => number = (a, b) => {
  return a + b;
};

/**
 * 方式三
 * 与方式一如出一辙，将声明提取出
 */
type FuncSum = (a: number, b: number) => number;
const sum2: FuncSum = (a, b) => a + b;

/**
 * 方式四
 * 同方式三，不过使用interface的方式处理
 * 如果只是为了描述这个函数的类型结构，可以使用这种方式。
 * 这个时候的interface就被称为：Callable Interface
 */
interface FuncSum2 {
  (a: number, b: number): number;
}
const sum3: FuncSum2 = (a, b) => a + b;

/**
 * ==================返回值=====================
 */

/**
 * void的处理
 * 在ts中，一个没有返回值的函数应该被标记为void而不是undefined。
 * 原因：ts中，undefined是一个实际、有意义的实际值，而void值才代表着空、没有意义的值。
 */
function foo(): void {}
/**
 * 这个返回应该写成undefined.
 * @returns undefined
 */
// function bar(): undefined {
function bar(): void {
  return;
}

/**
 * =============================参数传递=============================
 */
/**
 * 可选参数：？ 和 设置默认值
 * rest参数：相当于：any[]
 * 我们也可对rest参数进行设置
 */
function argsFunc(arg1: number, ...rest): void {}

/**
 * ==============================函数重载==========================
 * 目的：解决多种情况的参数 和对应的多种情况的返回值
 *
 */
function multiLoad(foo: number, bar: true): number;
function multiLoad(foo: number, bar: false): string;
function multiLoad(foo: number, bar: boolean): number | string {
  if (bar) {
    return String(foo);
  } else {
    return foo;
  }
}
export {};
